#include "common.hpp"

static const char *optString = "m:h?";

static const struct option longOpts[] = {
	{ "help", no_argument, NULL, 'h' },
	{ "max", required_argument, NULL, 'm' },
	{ 0,0,0,0 }
};

int main (int argc, char* const argv[]) {
	// Objetos IPC
	ipc::semaphore_with_exceptions mutex( ftok(BASE_NAME,10),0 );
	ipc::shared_memory_with_exceptions<sGimnasio> gim( ftok(BASE_NAME,11) );

	// Parametros.
	long max = 10;

	// Variables
	int longIndex = 0;
	int option = 0;
	bool ayuda = false;

	// Interpretación de parametros.
	while ( (option = getopt_long(argc,argv,optString,longOpts,&longIndex) ) != EOF ) {
		switch (option) {
			case '?':
			case 'h':
			case ':':
				ayuda = true;
				break;
			case 'm':
				max = parse(optarg,-1);
			default:
				break;
		}
	}

	if ( ayuda || (max < 0) ) {
		std::cerr << "Proceso para preparación del entorno y ejecución." << std::endl;
		std::cerr << "\tUso: " << argv[0] << " [-h] [--max natural]" << std::endl;
		std::cerr << "\tParametros:" << std::endl;
		std::cerr << "\t\t-h,--help:\tMostrar este mensaje de ayuda." << std::endl;
		std::cerr << "\t\t-m,--max:\tCantidad maxima de personas que soporta el gimnasio." << std::endl;

		return 0;
	}

	try {
		mutex.get(PERMITS | IPC_CREAT|IPC_EXCL);
		mutex.init(1);

		gim.get(PERMITS | IPC_CREAT|IPC_EXCL);

		(*gim).cantidad = 0;
		(*gim).maximo = static_cast<size_t>(max);

		for (size_t k=1; k<=2; k++) {
			if (fork() == 0) {
				std::string nombre = "Puerta "+parse(k);
				execlp("./puerta","puerta","-n",nombre.c_str(),"-p","10",(char*)NULL);

			}
		}
	} catch (ipc::exception& e) {
		logger << "Lanzador: " << e.what() << "." << nl;
		exit(-1);
	}

	return 0;
}

